package com.example.zz.example.pattern.facade;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;

import com.example.zz.example.R;

/**
 * 外观模式，外观模式也称为门面模式，使用频率非常高
 * 定义：外部与子系统的通信必须通过一个统一的外观对象进行。
 * 优点：对客户屏蔽子系统组件，实现了客户与子系统直接的松耦合
 * 缺点：违背了“开闭原则”，新增子系统要修改外观类
 *
 * 以手机为例，有拍照、打电话等功能，可以抽象出手机类接口提供给外部客户，外部客户通过手机类进行拍照和打电话，而不用关心具体打电话和拍照是怎么完成的
 *
 * Android源码中的外观模式，ContextImpl类。可以看到ContextImpl封装了startActivity、startService、sendBroadcast一系列核心方法，而各个方法内部又是通过调用其它类来实现的，很明显是外观模式；
 * https://blog.csdn.net/a734474820/article/details/128564741
 *
 */
public class FacadeActivity extends AppCompatActivity {

    private Mobile mobile;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_facade);
        mobile = new Mobile();
    }

    /**
     * 外部或者说客户，只需要对mobile进行相应的指令，不用关心具体的实现，相机，打电话他们拥有统一的外观（门面）mobile提供给外部进行调用
     * @param view
     */
    public void enterFacade(View view) {
        mobile.videoChat();
        mobile.videoChatClose();
        mobile.call();
        mobile.endCall();
        mobile.takePicture();
    }
}